//File  : placeholder.go
//Author: rockywish
//Date  : 2020-03-22
package main

import "fmt"

/*
	占位符
*/
func main() {
	//声明变量my_car
	my_car := Cars{Brand: "BWM"}
	/*
		普通占位符
	*/

	//%v 相应值的默认格式
	// \n为换行符
	//输出 my_car的值为 {BWM}
	fmt.Printf("my_car的值为 %v \n", my_car)

	//%+v 打印结构体 会添加字段名
	//{Brand:BWM}
	fmt.Printf("%+v \n", my_car)

	//定义变量rockywish_age
	var rockywish_age = 18

	//%T 相应值的类型
	//输出 rockywish_age的类型为 int
	fmt.Printf("rockywish_age的类型为 %T\n", rockywish_age)

	//字面上的百分号，并非值的占位符
	//输出 %
	fmt.Printf("%% \n")

	/*
		布尔占位符
	*/
	// %t  true 或 false。
	//输出true、false
	fmt.Printf("%t\n", true)
	fmt.Printf("%t\n", false)

	/*
		整数占位符
	*/
	var rockywish_id = 100

	//%b 以二进制表示
	//输出 1100100
	fmt.Printf("%b \n", rockywish_id)

	//%d 十进制表示
	//输出 100
	fmt.Printf("%d \n", rockywish_id)

	//%o 八进制表示
	//输出 144
	fmt.Printf("%o \n", rockywish_id)

	var rockywish_num = 15
	//%x 十六进制表示 字母形式为小写 a-f
	//输出 f
	fmt.Printf("%x \n", rockywish_num)

	//%X 十六进制表示 字母形式为大写 A-F
	//输出 F
	fmt.Printf("%X \n", rockywish_num)

	//Unicode码点所表示的字符
	//输出 %!c(string=中国)
	fmt.Printf("%c \n", "\u4e2d\u56fd")

	//单引号围绕的字符，由Go语法安全地转义
	//输出 '中'
	fmt.Printf("%q \n", 0x4E2D)

	/*
		浮点数和复数的组成
	*/
	var rockywish_price = 20.9
	//科学计数法
	//2.090000e+01
	fmt.Printf("%e \n", rockywish_price)

	//科学计数法
	//2.090000E+01
	fmt.Printf("%E \n", rockywish_price)

	//有小数点而无指数
	//20.900000
	fmt.Printf("%f \n", rockywish_price)

	//%g 根据情况选择 %e 或 %f 以产生更紧凑的（无末尾的0）
	//输出 20.9
	fmt.Printf("%g \n", rockywish_price)

	//%G 根据情况选择 %E 或 %f 以产生更紧凑的（无末尾的0）
	// 输出(20.9+5i)
	fmt.Printf("%G \n", 20.9+5i)

	/*
		字符串和切片
	*/

	//%s 输出字符串
	//输出 rockywish
	var rockywish_name = "rockywish"
	fmt.Printf("%s \n", rockywish_name)

	//%q    双引号围绕的字符串，由Go语法安全地转义
	//输出 "rockywish"
	fmt.Printf("%q \n", rockywish_name)

	//%x    十六进制，小写字母，每字节两个字符
	//输出 726f636b7977697368
	fmt.Printf("%x \n", rockywish_name)

	//%X    十六进制，大写字母，每字节两个字符
	//输出 726F636B7977697368
	fmt.Printf("%X \n", rockywish_name)

	/*
		指针
	*/
	//%p    十六进制表示，前缀 0x
	//输出 0xc000010220
	fmt.Printf("%p \n", &rockywish_name)

	/*
		符号与精度
		无符号：golang没有 ‘%u’ 占位符，若整数为无符号类型，默认就会被打印成无符号的
		 宽度与精度：控制格式以Unicode码点为单位。宽度为该数值占用区域的最小宽度；精度为小数点之后的位数。操作数的类型为int时，宽度与精度都可用字符 ‘*’ 表示。
		 对于 %g/%G 而言，精度为所有数字的总数，%e 和 %f 的默认精度为6，对大多数的数值类型而言，宽度为输出的最小字符数，如果必要的话会为已格式化的形式填充空格，而以字符串类型，精度为输出的最大字符数，如果必要的话会直接截断
	*/
	var rockywish_score = 123.626789
	//123.3
	fmt.Printf("%.4g \n", rockywish_score)
	//123.63
	fmt.Printf("%6.2f \n", rockywish_score)

	/*
		其他
	*/

	//+    总打印数值的正负号，对于%q（%+q）保证只输出ASCII编码的字符
	//输出 +10
	fmt.Printf("%+d \n", 0xA)

	//输出 "\u4e2d\u56fd"
	var china = "中国"
	fmt.Printf("%+q \n", china)

}

/*
为了更好的演示占位符，定义一个结构体,后续会专门讲解结构体
*/
type Cars struct {
	Brand string
}
